
#include "cd.h"
#include "cdfontex.h"
#include <stdlib.h>

typedef struct _cd_font_styles
{
  unsigned char s[4];
}cd_font_styles;

static cd_font_styles helv[256] = {
{0, 0, 0, 0},
{75, 75, 75, 75},
{75, 75, 75, 75},
{75, 75, 75, 75},
{75, 75, 75, 75},
{75, 75, 75, 75},
{75, 75, 75, 75},
{75, 75, 75, 75},
{75, 75, 75, 75},
{75, 75, 75, 75},
{75, 75, 75, 75},
{75, 75, 75, 75},
{75, 75, 75, 75},
{75, 75, 75, 75},
{75, 75, 75, 75},
{75, 75, 75, 75},
{75, 75, 75, 75},
{75, 75, 75, 75},
{75, 75, 75, 75},
{75, 75, 75, 75},
{75, 75, 75, 75},
{75, 75, 75, 75},
{75, 75, 75, 75},
{75, 75, 75, 75},
{75, 75, 75, 75},
{75, 75, 75, 75},
{75, 75, 75, 75},
{75, 75, 75, 75},
{75, 75, 75, 75},
{75, 75, 75, 75},
{75, 75, 75, 75},
{75, 75, 75, 75},
{30, 30, 30, 30},
{30, 30, 30, 35},
{35, 50, 35, 50},
{55, 55, 55, 55},
{55, 55, 55, 55},
{90, 85, 90, 90},
{70, 75, 70, 75},
{20, 25, 20, 25},
{35, 35, 35, 35},
{35, 35, 35, 35},
{40, 40, 40, 40},
{60, 60, 60, 60},
{30, 30, 30, 30},
{35, 35, 35, 35},
{30, 30, 30, 30},
{30, 30, 30, 30},
{55, 55, 55, 55},
{55, 55, 55, 55},
{55, 55, 55, 55},
{55, 55, 55, 55},
{55, 55, 55, 55},
{55, 55, 55, 55},
{55, 55, 55, 55},
{55, 55, 55, 55},
{55, 55, 55, 55},
{55, 55, 55, 55},
{30, 35, 30, 35},
{30, 35, 30, 35},
{60, 60, 60, 60},
{60, 60, 60, 60},
{60, 60, 60, 60},
{55, 65, 55, 60},
{100, 100, 100, 100},
{65, 70, 70, 75},
{70, 70, 70, 70},
{75, 75, 75, 75},
{75, 75, 75, 75},
{70, 65, 70, 70},
{60, 60, 65, 65},
{80, 80, 80, 80},
{70, 70, 75, 75},
{25, 30, 30, 30},
{50, 55, 55, 55},
{70, 75, 70, 75},
{55, 65, 55, 65},
{80, 85, 85, 90},
{70, 70, 75, 75},
{80, 80, 80, 80},
{65, 70, 70, 70},
{80, 80, 80, 80},
{75, 70, 75, 75},
{70, 70, 70, 70},
{60, 65, 65, 65},
{70, 70, 75, 75},
{65, 70, 70, 70},
{100, 95, 100, 95},
{65, 70, 70, 70},
{65, 65, 70, 65},
{60, 60, 65, 65},
{30, 35, 30, 35},
{30, 30, 30, 30},
{30, 35, 30, 35},
{45, 60, 50, 60},
{55, 55, 55, 55},
{35, 35, 35, 35},
{55, 60, 55, 60},
{55, 65, 60, 65},
{55, 55, 55, 55},
{55, 65, 55, 60},
{55, 60, 55, 55},
{30, 35, 30, 35},
{55, 65, 55, 60},
{55, 65, 55, 65},
{25, 30, 25, 30},
{25, 30, 25, 30},
{50, 60, 55, 60},
{25, 30, 25, 30},
{85, 90, 85, 90},
{55, 65, 55, 65},
{55, 65, 55, 65},
{55, 65, 55, 60},
{55, 65, 55, 65},
{35, 40, 35, 40},
{55, 55, 55, 55},
{30, 35, 30, 35},
{55, 65, 55, 60},
{50, 55, 50, 55},
{75, 80, 70, 80},
{50, 60, 50, 55},
{50, 55, 50, 55},
{50, 55, 50, 50},
{35, 40, 35, 40},
{25, 30, 25, 30},
{35, 40, 35, 40},
{60, 60, 60, 60},
{75, 75, 75, 75},
{75, 75, 75, 75},
{75, 75, 75, 75},
{25, 30, 25, 30},
{55, 55, 55, 55},
{35, 55, 30, 55},
{100, 100, 100, 100},
{55, 55, 55, 55},
{55, 55, 55, 55},
{35, 35, 35, 35},
{100, 105, 100, 100},
{70, 70, 70, 70},
{35, 35, 35, 35},
{100, 105, 100, 100},
{75, 75, 75, 75},
{75, 75, 75, 75},
{75, 75, 75, 75},
{75, 75, 75, 75},
{25, 30, 20, 30},
{25, 30, 20, 30},
{35, 55, 35, 55},
{35, 55, 30, 55},
{35, 35, 35, 35},
{55, 55, 55, 55},
{100, 100, 100, 100},
{30, 35, 30, 35},
{100, 100, 100, 100},
{55, 55, 55, 55},
{35, 35, 35, 35},
{95, 95, 95, 95},
{75, 75, 75, 75},
{75, 75, 75, 75},
{65, 65, 70, 65},
{30, 30, 30, 30},
{30, 30, 35, 35},
{55, 55, 55, 60},
{55, 55, 55, 55},
{60, 55, 60, 55},
{55, 55, 55, 55},
{25, 30, 25, 30},
{55, 55, 55, 55},
{35, 35, 35, 35},
{75, 75, 75, 80},
{35, 40, 40, 40},
{55, 55, 55, 55},
{60, 60, 60, 60},
{35, 35, 35, 35},
{75, 75, 75, 80},
{55, 55, 55, 55},
{40, 40, 40, 40},
{55, 55, 55, 60},
{35, 35, 35, 35},
{35, 35, 35, 35},
{35, 35, 35, 35},
{60, 60, 55, 60},
{55, 55, 55, 55},
{30, 30, 30, 30},
{35, 35, 35, 35},
{35, 35, 35, 35},
{40, 40, 40, 40},
{55, 55, 55, 55},
{85, 85, 85, 85},
{85, 85, 85, 85},
{85, 85, 85, 85},
{60, 65, 65, 60},
{65, 70, 70, 75},
{65, 70, 70, 75},
{65, 70, 70, 75},
{65, 70, 70, 75},
{65, 70, 70, 75},
{65, 70, 70, 75},
{100, 100, 100, 100},
{75, 75, 75, 75},
{70, 65, 70, 70},
{70, 65, 70, 70},
{70, 65, 70, 70},
{70, 65, 70, 70},
{25, 30, 30, 30},
{25, 30, 30, 30},
{25, 30, 30, 30},
{25, 30, 30, 30},
{75, 75, 75, 75},
{70, 70, 75, 75},
{80, 80, 80, 80},
{80, 80, 80, 80},
{80, 80, 80, 80},
{80, 80, 80, 80},
{80, 80, 80, 80},
{60, 60, 60, 60},
{80, 80, 80, 80},
{70, 70, 75, 75},
{70, 70, 75, 75},
{70, 70, 75, 75},
{70, 70, 75, 75},
{65, 65, 70, 65},
{70, 70, 70, 70},
{65, 65, 65, 65},
{55, 60, 55, 60},
{55, 60, 55, 60},
{55, 60, 55, 60},
{55, 60, 55, 60},
{55, 60, 55, 60},
{55, 60, 55, 60},
{90, 90, 90, 90},
{55, 55, 55, 55},
{55, 60, 55, 55},
{55, 60, 55, 55},
{55, 60, 55, 55},
{55, 60, 55, 55},
{25, 30, 25, 30},
{25, 30, 25, 30},
{25, 30, 25, 30},
{25, 30, 25, 30},
{55, 65, 55, 60},
{55, 65, 55, 65},
{55, 65, 55, 65},
{55, 65, 55, 65},
{55, 65, 55, 65},
{55, 65, 55, 65},
{55, 65, 55, 65},
{55, 55, 55, 55},
{60, 65, 65, 60},
{55, 65, 55, 60},
{55, 65, 55, 60},
{55, 65, 55, 60},
{55, 65, 55, 60},
{50, 55, 50, 55},
{55, 65, 55, 65},
{50, 55, 50, 55}
};

static cd_font_styles times[256] = {
{0, 0, 0, 0},
{80, 80, 80, 80},
{80, 80, 80, 80},
{80, 80, 80, 80},
{80, 80, 80, 80},
{80, 80, 80, 80},
{80, 80, 80, 80},
{80, 80, 80, 80},
{80, 80, 80, 80},
{80, 80, 80, 80},
{80, 80, 80, 80},
{80, 80, 80, 80},
{80, 80, 80, 80},
{80, 80, 80, 80},
{80, 80, 80, 80},
{80, 80, 80, 80},
{80, 80, 80, 80},
{80, 80, 80, 80},
{80, 80, 80, 80},
{80, 80, 80, 80},
{80, 80, 80, 80},
{80, 80, 80, 80},
{80, 80, 80, 80},
{80, 80, 80, 80},
{80, 80, 80, 80},
{80, 80, 80, 80},
{80, 80, 80, 80},
{80, 80, 80, 80},
{80, 80, 80, 80},
{80, 80, 80, 80},
{80, 80, 80, 80},
{80, 80, 80, 80},
{25, 25, 25, 25},
{35, 35, 30, 35},
{40, 55, 45, 55},
{55, 55, 55, 50},
{50, 55, 55, 55},
{85, 100, 85, 85},
{80, 85, 75, 80},
{20, 30, 25, 30},
{35, 35, 35, 35},
{35, 35, 35, 35},
{50, 55, 55, 55},
{60, 60, 70, 60},
{25, 25, 25, 25},
{35, 35, 35, 35},
{25, 25, 25, 25},
{30, 30, 30, 30},
{50, 55, 55, 55},
{50, 55, 55, 55},
{50, 55, 55, 55},
{50, 55, 55, 55},
{50, 55, 55, 55},
{50, 55, 55, 55},
{50, 55, 55, 55},
{50, 55, 55, 55},
{50, 55, 55, 55},
{50, 55, 55, 55},
{25, 35, 35, 35},
{30, 35, 35, 35},
{60, 60, 70, 60},
{60, 60, 70, 60},
{60, 60, 70, 60},
{45, 55, 55, 55},
{95, 95, 95, 85},
{70, 70, 60, 70},
{65, 70, 65, 70},
{70, 75, 70, 70},
{75, 75, 75, 75},
{60, 65, 65, 70},
{55, 60, 60, 70},
{70, 80, 75, 75},
{75, 80, 75, 80},
{35, 40, 35, 40},
{40, 55, 45, 50},
{75, 80, 65, 70},
{60, 65, 55, 65},
{90, 95, 85, 90},
{75, 75, 70, 75},
{75, 80, 75, 75},
{60, 65, 60, 65},
{75, 80, 75, 75},
{65, 75, 65, 70},
{55, 60, 55, 55},
{65, 65, 55, 65},
{70, 70, 75, 75},
{70, 70, 60, 65},
{95, 100, 80, 90},
{70, 70, 65, 70},
{70, 70, 55, 65},
{60, 65, 55, 65},
{35, 35, 40, 35},
{30, 30, 30, 30},
{35, 35, 45, 35},
{45, 60, 45, 60},
{55, 55, 55, 55},
{35, 35, 35, 35},
{45, 50, 55, 55},
{50, 55, 55, 50},
{45, 45, 45, 45},
{50, 55, 55, 55},
{45, 50, 45, 45},
{35, 35, 30, 35},
{50, 55, 55, 50},
{50, 55, 55, 55},
{25, 30, 30, 30},
{25, 35, 30, 30},
{50, 55, 50, 55},
{25, 30, 30, 30},
{75, 85, 75, 80},
{50, 55, 55, 55},
{50, 50, 55, 50},
{50, 55, 55, 55},
{50, 55, 55, 55},
{35, 45, 40, 40},
{40, 40, 40, 40},
{30, 35, 30, 30},
{50, 55, 55, 55},
{50, 50, 45, 45},
{70, 70, 65, 70},
{50, 50, 45, 55},
{50, 50, 45, 45},
{45, 45, 40, 40},
{50, 40, 40, 35},
{20, 25, 30, 25},
{50, 40, 40, 35},
{55, 55, 55, 60},
{80, 80, 80, 80},
{80, 80, 80, 80},
{80, 80, 80, 80},
{35, 35, 35, 35},
{50, 55, 50, 55},
{45, 55, 55, 55},
{100, 100, 90, 100},
{50, 50, 55, 55},
{50, 55, 55, 55},
{35, 35, 35, 35},
{100, 100, 100, 105},
{55, 60, 55, 55},
{35, 35, 35, 35},
{90, 100, 95, 95},
{80, 80, 80, 80},
{80, 80, 80, 80},
{80, 80, 80, 80},
{80, 80, 80, 80},
{35, 35, 35, 35},
{35, 35, 35, 35},
{45, 55, 55, 55},
{45, 55, 55, 55},
{35, 40, 35, 35},
{55, 55, 55, 55},
{100, 100, 90, 100},
{35, 35, 35, 35},
{100, 105, 100, 100},
{40, 40, 40, 40},
{35, 35, 35, 35},
{75, 75, 70, 75},
{80, 80, 80, 80},
{80, 80, 80, 80},
{70, 70, 55, 65},
{25, 25, 25, 25},
{35, 30, 40, 35},
{50, 55, 55, 55},
{50, 55, 55, 55},
{55, 55, 50, 50},
{55, 55, 55, 55},
{20, 25, 30, 25},
{50, 55, 55, 55},
{35, 40, 30, 35},
{75, 75, 75, 75},
{30, 30, 30, 30},
{50, 55, 55, 55},
{60, 60, 70, 60},
{35, 35, 35, 35},
{75, 75, 80, 75},
{55, 55, 55, 55},
{40, 40, 40, 40},
{55, 55, 55, 55},
{30, 30, 30, 30},
{30, 30, 30, 30},
{30, 35, 35, 35},
{55, 60, 60, 60},
{45, 55, 55, 55},
{25, 25, 25, 25},
{30, 35, 35, 35},
{30, 30, 30, 30},
{30, 35, 35, 30},
{50, 55, 55, 55},
{75, 75, 75, 75},
{75, 75, 75, 75},
{75, 75, 75, 75},
{45, 55, 50, 55},
{70, 70, 60, 70},
{70, 70, 60, 70},
{70, 70, 60, 70},
{70, 70, 60, 70},
{70, 70, 60, 70},
{70, 70, 60, 70},
{90, 100, 90, 95},
{70, 75, 70, 70},
{60, 65, 65, 70},
{60, 65, 65, 70},
{60, 65, 65, 70},
{60, 65, 65, 70},
{35, 40, 35, 40},
{35, 40, 35, 40},
{35, 40, 35, 40},
{35, 40, 35, 40},
{75, 75, 75, 75},
{75, 75, 70, 75},
{75, 80, 75, 75},
{75, 80, 75, 75},
{75, 80, 75, 75},
{75, 80, 75, 75},
{75, 80, 75, 75},
{60, 60, 70, 60},
{75, 80, 75, 75},
{75, 70, 75, 75},
{75, 70, 75, 75},
{75, 70, 75, 75},
{75, 70, 75, 75},
{70, 70, 55, 65},
{60, 65, 65, 65},
{50, 55, 55, 55},
{45, 50, 55, 55},
{45, 50, 55, 55},
{45, 50, 55, 55},
{45, 50, 55, 55},
{45, 50, 55, 55},
{45, 50, 55, 55},
{70, 75, 70, 75},
{45, 45, 45, 45},
{45, 50, 45, 45},
{45, 50, 45, 45},
{45, 50, 45, 45},
{45, 50, 45, 45},
{30, 30, 30, 30},
{30, 30, 30, 30},
{30, 30, 30, 30},
{30, 30, 30, 30},
{55, 50, 55, 55},
{50, 55, 55, 55},
{50, 50, 55, 50},
{50, 50, 55, 50},
{50, 50, 55, 50},
{50, 50, 55, 50},
{50, 50, 55, 50},
{55, 55, 55, 55},
{55, 50, 55, 55},
{50, 55, 55, 55},
{50, 55, 55, 55},
{50, 55, 55, 55},
{50, 55, 55, 55},
{50, 50, 45, 45},
{55, 55, 50, 50},
{50, 50, 45, 45}
};


typedef struct _cdFontType
{
  int max_width, line_height, ascent, descent, type_face, style, size;
  double sizex;
  int (*CharWidth)(char c);
}cdFontType;


static cdFontType font;


static int CharWidthCourier(char c)
{
  (void)c;
  return (int)(0.60 * font.sizex + 0.5);
}


static int CharWidthTimesRoman(char c)
{
  return (int)(times[(int)c].s[font.style] * font.sizex / 100 + 0.5);
}


static int CharWidthHelvetica(char c)
{
  return (int)(helv[(int)c].s[font.style] * font.sizex / 100 + 0.5);
}


void cdFontEx(int type_face, int style, int size)
{
  double mm_dx, mm_dy;
  double sizey, sizex;

  font.type_face = type_face;
  font.style = style;

  if (size < 0)
  {
    double size_mm;
    cdPixel2MM(-size, 0, &size_mm, NULL);
    size = (int)(size_mm * CD_MM2PT + 0.5);
  }

  font.size = size;

  cdPixel2MM(1, 1, &mm_dx, &mm_dy);

  sizey = ((25.4 / 72) / mm_dy) * size;
  sizex = ((25.4 / 72) / mm_dx) * size;

  font.sizex = sizex;

  font.line_height = (int)(1.2 * sizey + 0.5);
  font.ascent = (int)(0.75 * font.line_height + 0.5);
  font.descent = (int)(0.20 * font.line_height + 0.5);

  switch(type_face)
  {
  default:
    if (style == CD_PLAIN || style == CD_ITALIC)
      font.max_width = (int)(0.65 * sizex + 0.5);
    else
      font.max_width = (int)(0.80 * sizex + 0.5);

    font.CharWidth = CharWidthCourier;
    break;
  case CD_TIMES_ROMAN:
    if (style == CD_PLAIN || style == CD_BOLD)
      font.max_width = (int)(1.05 * sizex + 0.5);
    else
      font.max_width = (int)(1.15 * sizex + 0.5);

    font.CharWidth = CharWidthTimesRoman;
    break;
  case CD_HELVETICA:
    if (style == CD_PLAIN || style == CD_BOLD)
      font.max_width = (int)(1.05 * sizex + 0.5);
    else
      font.max_width = (int)(1.15 * sizex + 0.5);

    font.CharWidth = CharWidthHelvetica;
    break;
  }
}


void cdFontDimEx(int *max_width, int *line_height, int *ascent, int *descent)
{
  if (line_height) *line_height = font.line_height;
  if (max_width) *max_width = font.max_width;
  if (ascent) *ascent = font.ascent;
  if (descent) *descent = font.descent;
}


void cdTextSizeEx(char *s, int *width, int *height)
{
  int i = 0, numlin = 1, max_line_width = 0, line_width = 0;

  while (s[i] != '\0')
  {
    if (s[i] == '\n')
    {
      numlin++;
      line_width = 0;
    }
    else
    {
      line_width += font.CharWidth(s[i]);
    }

    if (line_width > max_line_width)
      max_line_width = line_width;

    i++;
  }

  if (height) *height = numlin * font.line_height;
  if (width) *width = max_line_width;
}


